Fork me on GitHub

MySQL 与 Python 交互(五)

前言:

  1. Python 与 MySQL 的交互流程;
  2. Connection 连接对象;
  3. Cursor 对象;
  4. sql 语句的参数化。

一、Python 操作 MySQL 步骤(重点)

1. Python 与 MySQL 的交互

Python与Mysql的交互.png

2. Python 访问数据库流程

提示:引入pymysql模块,通过该模块的api来访问mysql数据库(查看源码)

1. 创建一个Connection连接对象
2. 通过Connection连接对象取得游标Cursor对象
3. 通过游标执行Sql语句
4. 通过游标获取执行结果
5. 依据业务处理执行结果
6. 关闭游标
7. 关闭连接

使用Python DB API访问数据库流程.jpg

3. 连接数据库对象

快速写入conn连接代码的快捷技巧: PyCharm 快速输入技巧:Live Templates(自定义代码扩展)

conn = pymysql.connect(参数列表)
参数host:连接的mysql主机,如果本机是'localhost'
参数port:连接的mysql主机的端口,默认是3306
参数database:数据库的名称
参数user:连接的用户名
参数password:连接的密码
参数charset:通信采用的编码方式,推荐使用utf8

conn.cursor() # 返回Cursor对象,用于执行sql语句并获得结果
conn.commit() # 提交事务,当涉及增删改时,需要保存数据(持久化)到数据库中
conn.close() # 关闭连接

4. Cursor 对象

cs_tuple = conn.cursor()  # 默认为元组游标

cs_tuple.close() # 关闭
cs_tuple.execute(operation [, parameters ]) # 执行语句,返回受影响的行数,主要用于执行select、insert、update、delete语句,也可以执行create、alter、drop等语句
cs_tuple.fetchone() # 执行查询语句时,获取查询结果集的第一个行数据,返回一个元组
cs_tuple.fetchall() # 执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回

5. Cursor 对表的增删改查

提示:
Cursor:是一个生成器/迭代器
1. cs1 = conn.cursor() # 取得元组Cursor
2. cs1 = conn.cursor(cursor=pymysql.cursors.DictCursor) # 取得字典Cursor,结果集是以字典的形式呈现的
3. 对数据库进行增删改时,需要执行connection.commit()提交命令,把修改的数据持久化到数据库中(没有 commit 前是在内存中进行操作的)

查询
cs1.execute(sql, args)
cursor.fetchone() # 从结果集中抓取单条记录
cursor.fetchall() # 从结果集中抓取全部记录

item = cs_dict.fetchone() # 从结果集抓取一条数据,默认从第一个位置开始(抓取一次,游标下移一位,全部抓取完后,后面再抓取数据就为空)
print(item["name"], item["price"]) # 字典

增删改
cursor.execute(sql, args)
conn.commit()

6. sql 语句的参数化

1. 目的:通过sql参数化可以防止用户通过sql注入方式盗取数据

2. 出现的问题:

query_name = input("请输入要查询的名称:")

# 用户输入的值如下:
query_name = ' or 1 or '
query_name = ' or 1=1 or '

# sql字符串格式化后,会出现查询条件恒为True,即把所有数据都查询出来
sql = "select * from goods WHERE name='%s'" % sname
sql= select * from goods WHERE name='' or 1 or ''
sql = select * from goods WHERE name='' or 1=1 or ''

# 执行sql语句
cs1.execute(sql)

3. 解决办法:

sname=input("请输入要查询的名称:")

# 不用开发者自己拼接字符串
sql = "select * from goods WHERE name=%s"

params = [sname]

# 把sname作为sql参数传入到execute中,由sql的api来过滤一些特殊的字符
affect_num = cs1.execute(sql, params)

4. 模糊查询

-- like
sql = "select * from goods WHERE name like %s"
params = ['%%%s%%'%key_name] # %笔记本%,注意:% 需要转义, _不需要转义

-- rlike
sql = "select * from goods WHERE name rlike %s" # 正则实现模糊查询
params = [query_key] # 正则

affect_rows = cs1.execute(sql, params)
print("影响的行数:", affect_rows)
-------------本文结束感谢您的阅读-------------

本文标题:MySQL 与 Python 交互(五)

文章作者:曹永林

发布时间:2018年07月18日 - 05:07

最后更新:2018年07月28日 - 10:07

原始链接:http://jovelin.cn/2018/07/18/MySQL 与 Python 交互(五)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。